package strategy;

import java.math.BigDecimal;

/**
 * 名为上下文的原始类必须包含一个成员变量来存储对于每种策略的引用。
 * 上下文并不执行任务， 而是将工作委派给已连接的策略对象。
 *
 * 上下文不负责选择符合任务需要的算法——客户端会将所需策略传递给上下文。
 * 实际上， 上下文并不十分了解策略， 它会通过同样的通用接口与所有策略进行交互， 而该接口只需暴露一个方法来触发所选策略中封装的算法即可。
 *
 * 因此， 上下文可独立于具体策略。
 * 这样你就可在不修改上下文代码或其他策略的情况下添加新算法或修改已有算法了。
 */
public class DiscountContext {
    // 持有某个策略:
    private DiscountStrategy strategy;

    public DiscountContext(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    // 允许客户端设置新策略:
    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public BigDecimal calculatePrice(BigDecimal total) {
        return total.subtract(this.strategy.getDiscount(total)).setScale(2);
    }
}
